/**
 * 数组工具类
 */
export class ArrUtil {
	/**
	 * 从数组中移除首个指定元素
	 * @param arr 数组
	 * @param val 指定元素
	 */
	static remove<T>(arr: T[], val: T) {
		return arr.splice(arr.indexOf(val), 1);
	}

	/**
	 * 从数组中移除首个指定元素
	 * 此函数十分高效，但会改变数组的元素次序。
	 * @param arr 数组
	 * @param val 指定元素
	 */
	static removeFast<T>(arr: T[], value: T) {
		const idx = arr.indexOf(value);
		if (idx > -1) {
			arr[idx] = arr[arr.length - 1];
			--arr.length;
			return true;
		}
		return false;
	}

	/**
	 * 原数组过滤
	 * @param arr
	 * @param filter
	 */
	static filterBase<T>(arr: T[], filter: (val: T) => boolean) {
		let idx = 0;
		for (let i = 0; i < arr.length; ++i) {
			if (filter(arr[i])) {
				arr[idx++] = arr[i];
			}
		}
		arr.length = idx;
		return arr;
	}

	/**
	 * 原数组过滤 如果一个也没有则保持原来的数组
	 * @param arr
	 * @param filter
	 */
	static filterOrKeepBase<T>(arr: T[], filter: (val: T) => boolean) {
		let idx = 0;
		for (let i = 0; i < arr.length; ++i) {
			if (filter(arr[i])) {
				arr[idx++] = arr[i];
			}
		}
		if (idx > 0) {
			arr.length = idx;
		}
	}
}
